home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
tcl
/
tcl67.lha
/
tcl6.7
/
config
< prev
next >
Wrap
Text File
|
1993-02-10
|
11KB
|
355 lines
#!/bin/csh -f
#
# This script should be executed to configure the Tcl source directory
# for a particular system. It probes the system for various header
# files and library object files. Where things needed by Tcl are missing,
# substitute versions are included from the "compat" subdirectory.
#
# $Header: /user6/ouster/tcl/RCS/config,v 1.41 93/02/08 08:20:03 ouster Exp $ SPRITE (Berkeley)
#
# Copyright 1991, 1992 Regents of the University of California
# Permission to use, copy, modify, and distribute this
# software and its documentation for any purpose and without
# fee is hereby granted, provided that this copyright
# notice appears in all copies. The University of California
# makes no representations about the suitability of this
# software for any purpose. It is provided "as is" without
# express or implied warranty.
#--------------------------------------------------------------
# The variable definitions below configure this script: they
# tell where system-defined things are kept (so this program
# can tell whether the system contains certain features needed
# by Tcl), and they indicate which Tcl files to modify to
# reflect the configuration.
# Directory containing system include files:
set includeDir="/usr/include"
# Places to look for archive file containing object code for standard
# C library (the first existing file is used):
set libcFiles="/lib/libc.a /usr/lib/libc.a /lib/libc.so /usr/ccs/lib/libc.a"
# Makefile to modify:
set makefile="Makefile"
# Header file to modify to hold #defines about system configuration:
set config="tclUnix.h"
#--------------------------------------------------------------
set changes=0
unset time
# First make sure that the configuration variables have been
# set in a reasonable fashion.
if ( ! -r $includeDir/stdio.h ) then
echo "- ERROR\!\! $includeDir doesn't seem to contain standard system"
echo " include files. Please edit config to set the includeDir"
echo " variable."
exit(1)
endif
set libc=""
foreach i ($libcFiles)
if ( -r $i ) then
set libc=$i
break
endif
end
if ( $libc == "" ) then
echo "- ERROR\!\! C library $libc doesn\'t exist. Please edit config"
echo " to set the libc variable."
exit(1)
endif
# Extract name information from the C library archive. Different systems
# require different flags to nm, so the code below tries one way and sees
# if it generates standard error output (can't just check $status because
# on IBM systems the exit status is 0 even if there's an error). If there's
# a problem, try the operation again with a different set of switches.
(nm -p $libc > tmp.libc) >& tmp.err
set a = `cat tmp.err`
\rm tmp.err
if ( $#a ) then
nm -en $libc > tmp.libc
endif
if ( $status != 0 ) then
echo "- ERROR\!\! Nm failed to extract names of system-supplied library"
echo " procedures from $libc. You'll have to modify config by hand to"
echo " fix the problem (whatever it is)."
exit(1)
endif
# Since nm produces different output on different machines, the code
# below attempts to guess what pattern to grep for in the nm output.
set pattern="[ADIT]"
set x=`grep printf tmp.libc | grep -c CODE`
if ( $x ) then
set pattern=CODE
endif
set x=`grep printf tmp.libc | grep -c extern`
if ( $x ) then
set pattern="|extern|"
endif
# Check in the C library for particular library procedures and
# variables needed by Tcl.
set gettod=`grep gettimeofday tmp.libc | grep -c "$pattern"`
if ( $gettod > 1 ) set gettod=1
set getwd=`grep getwd tmp.libc | grep -c "$pattern"`
if ( $getwd > 1 ) set getwd=1
set opendir=`grep opendir tmp.libc | grep -c "$pattern"`
if ( $opendir > 1 ) set opendir=1
set strerror=`grep strerror tmp.libc | grep -c "$pattern"`
if ( $strerror > 1 ) set strerror=1
set strncasecmp=`grep strncasecmp tmp.libc | grep -c "$pattern"`
if ( $strncasecmp > 1 ) set strncasecmp=1
set strstr=`grep strstr tmp.libc | grep -c "$pattern"`
if ( $strstr > 1 ) set strstr=1
set strtod=`grep strtod tmp.libc | grep -c "$pattern"`
if ( $strtod > 1 ) set strtod=1
set strtol=`grep strtol tmp.libc | grep -c "$pattern"`
if ( $strtol > 1 ) set strtol=1
set strtoul=`grep strtoul tmp.libc | grep -c "$pattern"`
if ( $strtoul > 1 ) set strtoul=1
set sys_errlist=`grep sys_errlist tmp.libc | grep -c "$pattern"`
if ( $sys_errlist > 1 ) set sys_errlist=1
\rm tmp.libc
# Next, install header files that aren't present in /usr/include.
set extraHdrs=""
foreach i (dirent.h limits.h)
\rm -f $i
if ( ! -r $includeDir/$i ) then
cp compat/$i .
set extraHdrs="$extraHdrs $i"
endif
end
set stdlibOK=0
\rm -f stdlib.h
if ( -r $includeDir/stdlib.h ) then
# The check below is needed because SunOS has a stdlib that
# doesn't declare strtod and other procedures, so we have to
# use ours instead.
set chk1=`grep -c strtol $includeDir/stdlib.h`
set chk2=`grep -c strtoul $includeDir/stdlib.h`
set chk3=`grep -c strtod $includeDir/stdlib.h`
if ( $chk1 > 0 && $chk2 > 0 && $chk3 > 0 ) then
set stdlibOK=1
endif
endif
if ( ! $stdlibOK ) then
cp compat/stdlib.h .
set extraHdrs="$extraHdrs stdlib.h"
endif
# Even if string.h exists it's not complete on all systems. If
# some of the procedures we need are missing from the library, then
# also install a Tcl-specific string.h.
\rm -f string.h
if ( ! $strstr || ! $strtoul || ! $strncasecmp \
|| ! -r $includeDir/string.h ) then
cp compat/string.h .
set extraHdrs="$extraHdrs string.h"
endif
if ( "$extraHdrs" != "" ) then
echo "- Substitutes will be used for the following header files,"
echo " which aren't in ${includeDir} or aren't complete:"
echo " $extraHdrs"
set changes=1
endif
# Even if strtoul exists, it is bogus on some AIX systems. Detect
# this and pretend the system version doesn't exist if it's bogus.
if ( $strtoul ) then
cp compat/teststrtoul.c test.c
make configtest >& /dev/null
if ( $status == 0 ) then
./a.out
if ( $status != 0 ) then
set strtoul=0
endif
endif
\rm -f a.out test.c
endif
# Next, install C procedures for missing library functions.
set extraLibs=""
\rm -f strerror.c
if ( ! $strerror ) then
set extraLibs="$extraLibs strerror"
cp compat/strerror.c .
endif
\rm -f opendir.c
if ( ! $opendir ) then
set extraLibs="$extraLibs opendir"
cp compat/opendir.c .
\rm -f dirent.h
cp compat/dirent2.h dirent.h
echo "- No opendir/readdir/closedir library exists in this system,"
echo " so substitutes will be provided. This system better have"
echo " V7-style directories\!"
endif
\rm -f strncasecmp.c
if ( ! $strncasecmp ) then
set extraLibs="$extraLibs strcasecmp"
cp compat/strcasecmp.c .
endif
\rm -f strstr.c
if ( ! $strstr ) then
set extraLibs="$extraLibs strstr"
cp compat/strstr.c .
endif
\rm -f strtod.c
if ( ! $strtod ) then
set extraLibs="$extraLibs strtod"
cp compat/strtod.c .
endif
\rm -f strtol.c
if ( ! $strtol ) then
set extraLibs="$extraLibs strtol"
cp compat/strtol.c .
endif
\rm -f strtoul.c
if ( ! $strtoul ) then
set extraLibs="$extraLibs strtoul"
cp compat/strtoul.c .
endif
if ( "$extraLibs" != "" ) then
echo "- Substitutes will be used for the following library procedures,"
echo " which aren't in ${libc} or don't work correctly:"
echo " $extraLibs"
set changes=1
endif
# The following statements determine whether ranlib should be used
# in the Makefile. On System-V systems it shouldn't. The only way
# to figure this out is to run ranlib and see if it complains (ranlib
# actually exists on some Sys-V systems, but it returns an error if
# you run it).
set ranlibOK=0
cat > ranlibtest.c << EOF
#include <stdio.h>
main (argc, argv)
int argc;
char **argv;
{
printf ("Hello, world.\n");
}
EOF
cc -c ranlibtest.c
ar cru ranlibtest.a ranlibtest.o
ranlib ranlibtest.a >& /dev/null
if ( $status == 0 ) then
set ranlibOK=1
else
echo "- This system appears to be a System V one where ranlib isn't"
echo " used. The ranlib commands will be removed from Makefile."
set changes=1
endif
\rm -f ranlibtest.*
# Modify the Makefile to include supplemental library sources, if needed.
set compatObjs=""
foreach i ($extraLibs)
set compatObjs="$compatObjs $i.o"
end
if ( ! -e $makefile.bak ) mv $makefile $makefile.bak
if ( $ranlibOK ) then
sed -e "s/COMPAT_OBJS =/COMPAT_OBJS =$compatObjs/" $makefile.bak > $makefile
else
sed -e "s/COMPAT_OBJS =/COMPAT_OBJS =$compatObjs/" \
-e "/ranlib/d" $makefile.bak > $makefile
endif
# Set the #defines in tclUnix.h to provide various pieces of system
# configuration information at compile time (existence of header files,
# variables, type definitions, etc.)
if ( ! $gettod ) then
echo "- There's no gettimeofday in ${libc} so Tcl will use"
echo ' times for the "time" command.'
set changes=1
endif
if ( ! $getwd ) then
echo "- There's no getwd in ${libc} so Tcl will use"
echo ' getcwd for the "pwd" command.'
set changes=1
endif
set errlist=1
if ( ! $sys_errlist && ! $strerror ) then
echo "- Neither strerror nor sys_errlist is defined in ${libc} so"
echo " Tcl will make a guess about errno-related messages."
set errlist=0
set changes=1
endif
set sysTime=0
if ( -r $includeDir/sys/time.h ) then
set sysTime=1
endif
set sysWait=0
set unionWait=0
if ( -r $includeDir/sys/wait.h ) then
set sysWait=1
cp compat/testwait.c test.c
make configtest >& /dev/null
if ( $status == 0 ) then
set unionWait=1
endif
\rm -f a.out test.c
endif
set pid_t=1
cp compat/testpid.c test.c
make configtest >& /dev/null
if ( $status != 0 ) then
set pid_t=0
echo "- The type pid_t isn't defined in <sys/types.h> so Tcl will"
echo ' use "int" instead.'
endif
\rm -f a.out test.c
set uid_t=1
cp compat/testuid.c test.c
make configtest >& /dev/null
if ( $status != 0 ) then
set uid_t=0
echo "- The type uid_t isn't defined in <sys/types.h> so Tcl will"
echo ' use "int" instead.'
endif
\rm -f a.out test.c
if ( ! -e $config.bak ) mv $config $config.bak
set x=\.\*\$
sed -e "s/define TCL_GETTOD 1/define TCL_GETTOD $gettod/" \
-e "s/define TCL_GETWD 1/define TCL_GETWD $getwd/" \
-e "s/define TCL_SYS_ERRLIST 1/define TCL_SYS_ERRLIST $errlist/" \
-e "s/define TCL_SYS_TIME_H 1/define TCL_SYS_TIME_H $sysTime/" \
-e "s/define TCL_SYS_WAIT_H 1/define TCL_SYS_WAIT_H $sysWait/" \
-e "s/define TCL_UNION_WAIT 1/define TCL_UNION_WAIT $unionWait/" \
-e "s/define TCL_PID_T 1/define TCL_PID_T $pid_t/" \
-e "s/define TCL_UID_T 1/define TCL_UID_T $uid_t/" \
$config.bak > $config
if ( ! $changes ) then
echo "- No special modifications were needed for this system."
endif
# Create a file that indicates that config completed successfully.
echo > configured "This file is created to indicate that the"
echo >> configured '"config" script has been run to adjust'
echo >> configured "Tcl's configuration for this site and that"
echo >> configured "it completed successfully."